
package Report;

import java.rmi.RemoteException;
import java.util.Date;
import java.util.Vector;

import Flightadministration.*;
import Data.*;
import DB.*;

/**
 * Diese Klasse dient der Erstellung von Report. 
 * Zum einen besteht die Möglichkeit sich die Sitzplatzbelegung bestimmter Flüge anzeigen zu lassen,
 * zum anderen können kundenspezifische Reports erzeugt werden, die deren Flugbewegungen in einem bestimmten Zeitraum ausgeben.
 * Die verschiedenen Methoden geben diese Reports entweder als fertigen String oder als Reportobjekt zurück.
 *
 * @author In Anlehnung an Thies (Quelle: BankProjekt 1.1)
 * @author Philipp Armbruster
 */
public class ReportGeneratorImpl extends java.rmi.server.UnicastRemoteObject implements ReportGenerator {


    /* Variable für Zugriff auf die Flightadministration */
    private Flightadministration admin = null;

    /**
    * Jeder ReportGenerator benötigt Zugriff auf die Flightadministration.
    * Deren Angabe wird durch den Konstruktor realisiert.
    *
    * @param fa (Flightadministration)
    * @throws RemoteException
    * @see Flightadministration
    */
    public ReportGeneratorImpl(Flightadministration fa) throws java.rmi.RemoteException {
	this.admin = fa;
    }

    /**
     * Defaultkonstruktor
     */
    public ReportGeneratorImpl() throws java.rmi.RemoteException {
        
    }

    /**
    * Auslesen der zugehörigen Flightadministration.
    * 
    * @return das Flightadministrationobjekt
    */
    protected Flightadministration getFlightadministration() {
	return this.admin;
    }

    /**
     * Diese Methode fügt jedem Report ein Impressum mit allgemeinen Daten
     * wie Erstellungsdatum oder eine Seriennummer hinzu.
     *
     * @param r der um das Impressum zu erweiternde Report.
     */
    protected void addImprint(Report r) {

            // Dateobjekt erzeugen das das Erstellungsdatum des Reports enthält.
            Date dateOfCreation = new Date();

            // StringBuffer aus Date-Objekt erzeugen
            StringBuffer dateOfCreationAsString = r.convertDateToString(dateOfCreation);

            // Seriennummer aus Dateobjekt erzeugen.
            long serial = dateOfCreation.getTime();

            // Erstellen eines mehrzeiligen Absatzes für das Impressum.
            CompositeParagraph imprint = new CompositeParagraph();

                imprint.addSubParagraph(new SimpleParagraph("Erstellungsdatum: " + dateOfCreationAsString));
                imprint.addSubParagraph(new SimpleParagraph("Seriennummer des Reports: " + serial));

            // Abschließend wird das Impressum dem Report hinzugefügt.
            r.setImprint(imprint);

    }

    /**
     * Erstellen von <code>SeatallocationOfASpecificFlightRealizationReport</code>-Objekten.
     *
     * @param fr, FlightRealization-Objekt von welchem der Report erstellt werden soll.
     * @return der fertige Report
     * @throws java.rmi.RemoteException
     */
    public SeatallocationOfASpecificFlightRealizationReport createSeatallocationOfASpecificFlightRealizationReport(int realizationId)
            throws java.rmi.RemoteException {

            // Zunächst wird ein leerer Report angelegt.
            SeatallocationOfASpecificFlightRealizationReport report = new SeatallocationOfASpecificFlightRealizationReport();

            /*
             *  Objekte für Mapperklassen erzeugen
             */
                // FlightMapper-Objekt erzeugen
                FlightMapper flightMapper = FlightMapper.getInstance();

                //FlightRealizationMapper-Objekt erzeugen
                FlightRealizationMapper flightRealizationMapper = FlightRealizationMapper.getInstance();

                // AirportMapper-Objekt erzeugen
                AirportMapper airportMapper = AirportMapper.getInstance();

                // AirlineMapper-Objekt erzeugen
                AirlineMapper airlineMapper = AirlineMapper.getInstance();

                // BookingMapper-Objekt erzeugen
                BookingMapper bookingMapper = BookingMapper.getInstance();

                // PassengerMapper-Objekt erzeugen
                PassengerMapper passengerMapper = PassengerMapper.getInstance();


            // FlightRealization über realizationId auslesen
            FlightRealization fr = flightRealizationMapper.findById(realizationId);

            // Jeder Report bekommt einen Titel.
            report.setTitle("Sitzplatzbelegung von Flug " + realizationId);

            // Imressum hinzufügen
            this.addImprint(report);

            // Nun werden die Kopfdaten in einem mehrzeiligen Absatz zusammengestellt
            CompositeParagraph header = new CompositeParagraph();

                // Gesamtsitzplatzanzahl aus FlightRealization in Integervariable speichern
                int numberOfAllSeats = flightRealizationMapper.getNumberOfAllSeats(realizationId);

                // FlightId aus realizationId auslesen
                int flightId = flightRealizationMapper.findFlightIdByRealizationId(realizationId);

                // Mittels flightId neues Flightobjekt erzeugen
                Flight f = flightMapper.findById(flightId);

                    // Id des Startflughafens aus Flight auslesen und in Stringvariable zwischenspeichern.
                    String internationalIdOfDepartureAirport = f.getDepartureAirportId();
                    // Id des Ziellughafens aus Flight auslesen und in Stringvariable zwischenspeichern.
                    String internationalIdOfArrivalAirport = f.getArrivalAirportId();

                            // Mittels des internationalen Kürzel neues Flughafenobjekt erzeugen
                            Airport departureAirport = airportMapper.findByInternationalId(internationalIdOfDepartureAirport);

                                // Stadt des Flughafenobjektes auslesen und in Stringvariable speichern
                                String cityOfDepartureAirport = departureAirport.getPortCity();

                            // Mittels des internationalen Kürzel neues Flughafenobjekt erzeugen
                            Airport arrivalAirport = airportMapper.findByInternationalId(internationalIdOfArrivalAirport);

                                // Stadt des Flughafenobjektes auslesen und in Stringvariable speichern
                                String cityOfArrivalAirport = arrivalAirport.getPortCity();

                    // Id der Airline aus Flight auslesen und in Integervariable speichern
                    int airlineId = f.getAirlineId();

                            // Mittels der Id neues Airlineobjekt erzeugen
                            Airline a = airlineMapper.findById(airlineId);

                                // Name der Airline auslesen und in Stringvariable speichern
                                String nameOfAirline = a.getAirName();

                    // Abflugsdatum auslesen und Date-Objekt in String konvertieren
                    Date dateOfDeparture = fr.getDateOfDeparture();
                    StringBuffer dateOfDepartureAsString = report.convertDateToString(dateOfDeparture);

                    // Ankunftssdatum auslesen und Date-Objekt in String konvertieren
                    Date dateOfArrival = fr.getDateOfArrival();
                    StringBuffer dateOfArrivalAsString = report.convertDateToString(dateOfArrival);


                // Vector mit allen Buchungen dieser FlightRealization erzeugen
                Vector<Booking> bookings = bookingMapper.findAllByRealizationId(realizationId);
                
                // Vector mit allen Buchungen die bereits eingecheckt haben erzeugen
                Vector<Booking> allBookingsWhichAreAlreadyCheckedIn =
                        bookingMapper.findAllByAlreadyCheckedInAndSpecificFlightRealization(realizationId);

                        // Anzahl an Buchungen die bereits eingecheckt haben in int-Variable speichern
                        int numberOfCheckedInBookings = allBookingsWhichAreAlreadyCheckedIn.size();
                    
                header.addSubParagraph(new SimpleParagraph("<p style=\"color:gray\">Allgemeine Informationen zum ausgewählten Flug:</p>"));
                // Leerzeile einfügen
                header.addSubParagraph(new SimpleParagraph(" "));
                /* Id des ausgewählten Fluges sowie den Start- und den Zielort aufnehmen
                 *  (z.B. Flug 123, durchgeführt von Lufthansa, von Stuttgart nach Berlin) */
                header.addSubParagraph(new SimpleParagraph("Flug " + realizationId + ", durchgeführt von " + nameOfAirline +
                                                            ", von " + cityOfDepartureAirport + " nach " + cityOfArrivalAirport));
                /* Abflugdatum, Wochentag und Uhrzeit aufnehmen
                 *  (z.B. Abflugzeitpunkt, Montag 26. Dezember 2011, um 11:30Uhr) */
                header.addSubParagraph(new SimpleParagraph("Abflugzeitpunkt, " + dateOfDepartureAsString + ", um " + f.getTimeOfDeparture()));

                /* Ankunftsdatum, Wochentag und Uhrzeit aufnehmen
                 *  (z.B. Ankunftszeitpunkt, Freitag 30. Dezember 2011, um 21:15Uhr) */
                header.addSubParagraph(new SimpleParagraph("Ankunftszeitpunkt, " + dateOfArrivalAsString + ", um " + f.getTimeOfArrival()));
                // Leerzeile einfügen
                header.addSubParagraph(new SimpleParagraph(" "));

                if(bookings.size() == 0) {

                    header.addSubParagraph(new SimpleParagraph("<p style=\"color:red; text-align:center\">    ***    Leider sind für diesen Flug noch keine Buchungen eingegangen    ***    </p>"));
                }
                else {

                    header.addSubParagraph(new SimpleParagraph("<p style=\"color:gray\">Allgemeine Informationen zur aktuellen Sitzplatzbelegung:</p>"));
                    // Leerzeile einfügen
                    header.addSubParagraph(new SimpleParagraph(" "));
                    /* Gesamtanzahl an Sitzplätzen aufnehmen
                     *  (z.B. Dieser Flug hat eine Gesamtanzahl von 80 Sitzplätzen) */
                    header.addSubParagraph(new SimpleParagraph("Bei diesem Flug sind aktuell " + bookings.size() +
                                                                " von " + numberOfAllSeats + " Plätzen belegt."));
                    header.addSubParagraph(new SimpleParagraph("Von den aktuell " + bookings.size() + " gebuchten Fluggästen haben bereits "
                                                                + numberOfCheckedInBookings + " eingecheckt."));
                }

            // Hinzufügen der zusammengestellten Kopfdaten zu dem Report
            report.setHeaderData(header);


            if(bookings.size() != 0) {
            // Nun folgt das zeilenweises Hinzufügen von Buchungsinformationen.

                // Hier legen wir eine Kopfzeile für die Buchungstabelle an.
                Row headline = new Row();

                /*
                 * Die Tabelle soll aus 4 Spalten bestehen.
                 * Die erste Spalte soll die Buchungsnummer enthalten, die zweite Spalte den Namen des Passagiers,
                 * die dritte Spalte enthält, wenn der Passagier bereits eingecheckt hat, das Datum des Check-in und
                 * die vierte Spalte enthält den Sitzplatz des Passagiers nach erfolgtem Check-in.
                 *
                 * (z.B.    Buchungsnummer  |   Passagier    |   Check-in-Datum   |   Sitzplatz
                 *          43443               Peter Meier     28.12.2011          6D
                 *
                 * In der Kopfzeile legen wir für diese Spalten entsprechende Überschriften an.
                 */
                headline.addColumn(new Column("<p style=\"color:gray\">Buchungsnr.</p>"));
                headline.addColumn(new Column("<p style=\"color:gray\">Name des Passagiers</p>"));
                headline.addColumn(new Column("<p style=\"color:gray\">Datum des Check-in</p>"));
                headline.addColumn(new Column("<p style=\"color:gray\">Sitzplatz des Passagiers</p>"));

                // Hinzufügen der Kopfzeile
                report.addRow(headline);

                /*
                 * Nun werden sämtliche Buchungen der FlightRealization ausgelesen und
                 * Buchungsnummer, Informationen über den Passagier, Check-in-Datum und Sitzplatz
                 * sukzessive in die Tabelle eingetragen.
                 */

                for (int i = 0; i<bookings.size(); i++) {

                    // Zunächst wird eine leere Zeile angelegt
                    Row bookingRow = new Row();

                            // Nun muss noch ein Passagier-Objekt erzeugt werden aus dem der Name des Passagiers ausgelesen werden kann
                            Passenger p = passengerMapper.findById(bookings.get(i).getPassengerId());
                            String firstName = p.getFirstName();
                            String lastName = p.getLastName();

                    // Erste Spalte: Buchungsnummer hinzufügen
                    bookingRow.addColumn(new Column(String.valueOf(bookings.get(i).getBookingId())));

                    // Zweite Spalte: Name des Passagiers hinzufügen
                    bookingRow.addColumn(new Column(firstName + " " + lastName));

                            // Wert des Check-in-Datums auslesen
                            StringBuffer checkInDate = report.convertDateToString(bookings.get(i).getCheckInDate());
                            // Sitzplatz als String auslesen
                            String seatPosition = bookings.get(i).getSeatPosition();

                    // Prüfen ob der Check-in bereits durchgeführt wurde
                    if(seatPosition.equals("")) {
                            // Wenn der Check-in noch nicht durchgeführt wurde, wird der dritten Spalte eine Meldung hinzugefügt
                            bookingRow.addColumn(new Column("Noch kein Check-in erfolgt"));
                            // Wenn der Buchung noch kein Sitzplatz zugewiesen wurde, wird eine Meldung in der vierten Spalte hinzugefügt.
                            bookingRow.addColumn(new Column("Noch kein Sitzplatz zugewiesen"));
                    }
                    else {
                            // Wurde der Check-in bereits durchgeführt, dritte Spalte mit Check-in-Datum hinzufügen
                            bookingRow.addColumn(new Column(String.valueOf(checkInDate)));
                            // Falls vorhanden, wierte Spalte mit Sitzplatz des Passagiers hinzufügen
                            bookingRow.addColumn(new Column(String.valueOf(bookings.get(i).getSeatPosition())));
                    }

                    // Abschließend wird die Zeile dem Report hinzufügen.
                    report.addRow(bookingRow);
                }
            }
            else {
                
            }
        // Abschließend wird der fertige Report zurück gegeben
        return report;
    }


    
    /**
     * Erstellen von <code>FlightmovementsOfSpecificPassengerReport</code>-Objekten.
     *
     * @param passengerId, Kundennummer des Passagier.
     * @param airlineId, die eindeutige Id der Airline.
     * @param startOfTimeframe, der Beginn des Zeitraums.
     * @param endOfTimeframe, das Ende des Zeitraums.
     * @return der fertige Report
     * @throws java.rmi.RemoteException
     */
    public FlightmovementsOfSpecificPassengerReport createFlightmovementsOfSpecificPassengerReport(int passengerId, int airlineId, Date startOfTimeframe, Date endOfTimeframe)
            throws java.rmi.RemoteException {

            // Zunächst wird ein leerer Report angelegt.
            FlightmovementsOfSpecificPassengerReport report = new FlightmovementsOfSpecificPassengerReport();

            //Objekte für Mapperklassen erzeugen
            
                    // FlightMapper-Objekt erzeugen
                    FlightMapper flightMapper = FlightMapper.getInstance();

                    //FlightRealizationMapper-Objekt erzeugen
                    FlightRealizationMapper flightRealizationMapper = FlightRealizationMapper.getInstance();

                    // AirportMapper-Objekt erzeugen
                    AirportMapper airportMapper = AirportMapper.getInstance();

                    // AirlineMapper-Objekt erzeugen
                    AirlineMapper airlineMapper = AirlineMapper.getInstance();

                    // BookingMapper-Objekt erzeugen
                    BookingMapper bookingMapper = BookingMapper.getInstance();

                    // PassengerMapper-Objekt erzeugen
                    PassengerMapper passengerMapper = PassengerMapper.getInstance();


                // Passagier-Objekt auslesen
                Passenger p = passengerMapper.findById(passengerId);

                    // Informationen über den Passagier in Stringvariablen speichern
                    String customerId = String.valueOf(p.getPassengerId());
                    String name = p.getFirstName() + " " + p.getLastName();
                    String street = p.getStreet();
                    String city = String.valueOf(p.getPostcode()) + " " + p.getCity();

                // Airlineobjekt auslesen
                Airline a = airlineMapper.findById(airlineId);

                    // Airlineinformationen in Stringvariablen speichern
                    String airId = String.valueOf(a.getAirId());
                    String airName = a.getAirName();

                // Dateobjekte für gewünschten Zeitraum auslesen

                    // Dateobjekt für Startdatum
                    Date startOfTimeFrame = startOfTimeframe;
                    // Dateobjekt für Enddatum
                    Date endOfTimeFrame = endOfTimeframe;
                
            // Jeder Report bekommt einen einen Titel.
            report.setTitle("Alle Flüge von Passagier " + customerId + ", im Zeitraum von "
                            + report.convertDateToString(startOfTimeFrame) + " bis " + report.convertDateToString(endOfTimeFrame));

            // Imressum hinzufügen
            this.addImprint(report);


            /*
             * Sämtliche Flüge ausgelesen die später in die Tabelle eingetragen werden sollen.
             */

                // Objekt vom Typ Flightadministration erzeugen
                Flightadministration fa = new FlightadministrationImpl();

                // Alle Buchungen basierend auf der passangerId, der airlineId und des Zeitraums werden in einen Vector gespeichert
                Vector<Booking> allFlightRealizationsOfPassengerInTimeframeByAirline =
                        fa.findBookingsByPassengerByAirlineAndByTimeframe(passengerId, airlineId, startOfTimeFrame, endOfTimeFrame);



            // Nun werden die Kopfdaten in einem mehrzeiligen Absatz zusammengestellt
            CompositeParagraph header = new CompositeParagraph();

                /* Informationen über die ausgewählte Fluglinie aufnehmen
                 *  (z.B.   Informationen über die ausgewählte Airline:
                 *
                 *          Id der Fluglinie:   34
                 *          Name der Fluglinie: Lufthansa   )
                 */
                header.addSubParagraph(new SimpleParagraph("<p style=\"color:gray\">Allgemeine Informationen über die Airline:</p>"));

                header.addSubParagraph(new SimpleParagraph(""));

                header.addSubParagraph(new SimpleParagraph("Id der Fluglinie: " + airId));

                header.addSubParagraph(new SimpleParagraph("Name der Fluglinie: " + airName));

                header.addSubParagraph(new SimpleParagraph(""));


                /* Informationen über den Passagier aufnehmen
                 *  (z.B.   Informationen über den Passagier:
                 *
                 *          Kundennummer:   53454
                 *          Name:           Peter Meier
                 *          Anschrift:      Molkestraße 4
                 *          Wohnort:        Stuttgart   )
                 */
                header.addSubParagraph(new SimpleParagraph("<p style=\"color:gray\">Allgemeine Informationen über den Passagier:</p>"));

                header.addSubParagraph(new SimpleParagraph(""));

                header.addSubParagraph(new SimpleParagraph("Kundennummer: " + customerId));

                header.addSubParagraph(new SimpleParagraph("Name: " + name));

                header.addSubParagraph(new SimpleParagraph("Anschrift: " + street));

                header.addSubParagraph(new SimpleParagraph("Wohnort: " + city));

                header.addSubParagraph(new SimpleParagraph(""));


                if(allFlightRealizationsOfPassengerInTimeframeByAirline.size() == 0) {

                    header.addSubParagraph(new SimpleParagraph("<p style=\"color:red; text-align:center\">    ***    Leider sind noch keine Buchungen vorhanden    ***    </p>"));

                }
                else{

                    /* Informationen über den ausgewählten Zeitraum aufnehmen
                     *  (z.B.   Alle Flüge befinden sich im Zeitraum vom 12. März 2012 bis 12. August 2012. )
                     */
                    header.addSubParagraph(new SimpleParagraph("Die nachfolgend aufgelisteten Flüge befinden sich alle im Zeitraum von "));
                    header.addSubParagraph(new SimpleParagraph(report.convertDateToString(startOfTimeFrame) + " bis "
                                                                + report.convertDateToString(endOfTimeFrame)));
                }
            // Hinzufügen der zusammengestellten Kopfdaten zu dem Report
            report.setHeaderData(header);


            if(allFlightRealizationsOfPassengerInTimeframeByAirline.size() != 0) {
                
            // Nun folgt das zeilenweises Hinzufügen aller Flüge im gewünschten Zeitraum.

                // Hier legen wir eine Kopfzeile für die Tabelle mit allen Flügen an.
                Row headline = new Row();

                    /*
                     * Die Tabelle soll aus 10 Spalten bestehen.
                     * Die erste Spalte soll die Buchungsnummer enthalten, spalte zwei die Flugnummer,
                     * die Spalten drei bis fünf enthalten Abflugswochentag, -datum und -uhrzeit.
                     * Spalte sechs enthält den Startort und Spalte 7 den Zielort des Fluges.
                     * Die Spalten acht bis zehn enthalten Ankunftswochentag, -datum und -uhrzeit.
                     *
                     * (z.B.    BuchungsNr  |   FlugNr  |   Abflugtag    |   Abflugdatum   |   Uhrzeit  |   Von                     | ...
                     *          3422            43443       Montag           28.12.2011        13:15        Stuttgart, Deutschland    ...
                     *
                     * In der Kopfzeile legen wir für diese Spalten entsprechende Überschriften an.
                     */
                    headline.addColumn(new Column("<p style=\"color:gray\">Buchungsnr.</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Flugnr.</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Abflugtag</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Abflugdatum</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Uhrzeit</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Von</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Nach</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Ankunftstag</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Ankunftsdatum</p>"));
                    headline.addColumn(new Column("<p style=\"color:gray\">Uhrzeit</p>"));

                // Hinzufügen der Kopfzeile
                report.addRow(headline);

                /**
                 *
                 *  Nun werden die einzelnen Tabellenzeilen mit Daten befüllt.
                 *
                 */
                for (int i = 0; i<allFlightRealizationsOfPassengerInTimeframeByAirline.size(); i++) {

                        // Zunächst wird die realizationId der aktuellen FlightRealization ausgelesen und in eine Integervariable gespeichert
                        int realizationId = allFlightRealizationsOfPassengerInTimeframeByAirline.get(i).getRealizationId();
                            // Mittels der realizationId wird das aktuelle FlightRealizationobjekt ausgelesen
                            FlightRealization flightR = flightRealizationMapper.findById(realizationId);

                        // Auf Grundlage der realizationId wird dann die flightId der FlightRealization ausgelesen und in eine Integervariable gespeichert
                        int flightId = flightRealizationMapper.findFlightIdByRealizationId(realizationId);
                            /* Nun wird mittels der flightId das entsprechende Flightobjekt ausgelesen das benötigt wird um den Wochentag,
                             * die Uhrzeit sowie den Start- und Zielort des Fluges in der Tabelle auszugeben */
                            Flight f = flightMapper.findById(flightId);


                        // Aus dem Flightobjekt wird die internationalId des Startflughafens ausgelesen
                        String internationalIdOfDepartureAirport = f.getDepartureAirportId();
                            // Mittels der internationalId wird dann das entsprechende Airportobjekt (DepartureAirport) ausgelesen
                            Airport dA = airportMapper.findByInternationalId(internationalIdOfDepartureAirport);
                        // Aus dem Flightobjekt wird die internationalId des Zielflughafens ausgelesen
                        String internationalIdOfArrivalAirport = f.getArrivalAirportId();
                            // Mittels der internationalId wird dann das entsprechende Airportobjekt (ArrivalAirport) ausgelesen
                            Airport aA = airportMapper.findByInternationalId(internationalIdOfArrivalAirport);


                        // Startdatum des aktuellen Fluges aus FlightRealizationobjekt auslesen und in einen String konvertieren
                        Date dateOfDeparture = flightR.getDateOfDeparture();
                        StringBuffer dayOfDepartureAsString = report.convertDateToStringWithoutWeekday(dateOfDeparture);
                        // Ankunftsdatum des aktuellen Fluges aus FlightRealizationobjekt auslesen und in einen String konvertieren
                        Date dateOfArrival = flightR.getDateOfArrival();
                        StringBuffer dayOfArrivalAsString = report.convertDateToStringWithoutWeekday(dateOfArrival);


                        // Für das befüllen der Tabelle wird zunächst eine leere Zeile angelegt
                        Row flightRow = new Row();

                            // Erste Spalte: Buchungsnummer hinzufügen
                            flightRow.addColumn(new Column(String.valueOf(allFlightRealizationsOfPassengerInTimeframeByAirline.get(i).getBookingId())));

                            // Zweite Spalte: Flugnummer hinzufügen
                            flightRow.addColumn(new Column(String.valueOf(allFlightRealizationsOfPassengerInTimeframeByAirline.get(i).getRealizationId())));

                            // Dritte Spalte: Wochentag des Starts hinzufügen
                            flightRow.addColumn(new Column(f.getDayOfDeparture()));

                            // Vierte Spalte: Abflugdatum des Fluges hinzufügen
                            flightRow.addColumn(new Column(String.valueOf(dayOfDepartureAsString)));

                            // Fünfte Spalte: Uhrzeit des Starts hinzufügen
                            flightRow.addColumn(new Column(f.getTimeOfDeparture()));

                            // Sechste Spalte: Startort des Fluges hinzufügen
                            flightRow.addColumn(new Column(dA.getPortCity() + ", " + dA.getPortCountry()));

                            // Siebte Spalte: Zielort des Fluges hinzufügen
                            flightRow.addColumn(new Column(aA.getPortCity() + ", " + aA.getPortCountry()));

                            // Achte Spalte: Wochentag der Landung hinzufügen
                            flightRow.addColumn(new Column(f.getDayOfArrival()));

                            // Neunte Spalte: Ankunftsdatum des Fluges hinzufügen
                            flightRow.addColumn(new Column(String.valueOf(dayOfArrivalAsString)));

                            // Zehnte Spalte: Uhrzeit der Landung hinzufügen
                            flightRow.addColumn(new Column(f.getTimeOfArrival()));
                            

                        // Abschließend wird die Zeile dem Report hinzufügen.
                        report.addRow(flightRow);
                }
            }
            else{
                
            }

        // Abschließend wird noch der fertige Report zurückgeben.
        return report;
    }

    /**
     * Methode gibt den übergebenen Report in einem eigenen Frame im Html-Format aus
     *
     * @param report
     * @throws java.rmi.RemoteException
     */
    public void outputSeatallocationOfASpecificFlightRealizationReport(SeatallocationOfASpecificFlightRealizationReport report)
            throws java.rmi.RemoteException {

        // Neues Objekt erzeugen, process-Methode ausführen und Ergebnis davon in Stringvariable speichern
        HTMLReportWriter htmlWriter = new HTMLReportWriter();
        htmlWriter.process(report);
        String textForLabel = htmlWriter.getReportText();

        // Frame-Objekt erzeugen
        ReportGUI rG = new ReportGUI();
        // Report übergeben
        rG.setLabelText(textForLabel);
        // Frame mit Report erzeugen
        rG.createFrame(rG, 900, 600);
    }


    /**
     * Methode gibt den übergebenen Report in einem eigenen Frame im Html-Format aus
     *
     * @param report
     * @throws java.rmi.RemoteException
     */
    public void outputFlightmovementsOfSpecificPassengerReport(FlightmovementsOfSpecificPassengerReport report)
            throws java.rmi.RemoteException {

        // Neues Objekt erzeugen, process-Methode ausführen und Ergebnis davon in Stringvariable speichern
        HTMLReportWriter htmlWriter = new HTMLReportWriter();
        htmlWriter.process(report);
        String textForLabel = htmlWriter.getReportText();

        // Frame-Objekt erzeugen
        ReportGUI rG = new ReportGUI();
        // Report übergeben
        rG.setLabelText(textForLabel);
        // Frame mit Report erzeugen
        rG.createFrame(rG, 1000, 600);

    }
}